def ip_to_bin(ip):
    pos_punto_pre = 0
    pos_punto_pos = 0
    
    ip_bin = ""
    
    for i in range(3):
        pos_punto_pos = ip.find(".", pos_punto_pre)
        sub_str = ip[pos_punto_pre:pos_punto_pos]      
        
        #print sub_str
        
        # Pasamos a binario
        sub_str = bin(int(sub_str))
        
        # Sacamos los dos primeros caracteres que son "0b"
        sub_str = sub_str[2:]
        
        # Completar con "0"s hasta llegar a la longitud de 8 bits 
        while(len(sub_str) < 8):
            sub_str = "0" + sub_str
            
        ip_bin += sub_str
        pos_punto_pre = pos_punto_pos + 1
    
    # Agregamos lo que falta
    sub_str = ip[pos_punto_pre:]
	
    # Pasamos a binario
    sub_str = bin(int(sub_str))
    
    # Sacamos los dos primeros caracteres que son "0b"
    sub_str = sub_str[2:]
    
    # Completar con "0"s hasta llegar a la longitud de 8 bits 
    while(len(sub_str) < 8):
	sub_str = "0" + sub_str
    
    ip_bin += sub_str
    
    return ip_bin


def bin_to_ip(ip_bin):
    pos = 0    
    ip = ""
    
    for i in range(3):
        sub_str = ip_bin[pos:pos + 8]      
            
        # Pasamos a decimal
        sub_str = str(int(sub_str, 2))
            
        ip += sub_str + "."
        pos += 8
	
    # Agregamos el ultimo
    sub_str = ip_bin[pos:]      
	    
    # Pasamos a decimal
    sub_str = str(int(sub_str, 2))
	
    ip += sub_str
    
    return ip

# Toma una direccion ip y la incrementa en 1
def inc(ip):
    pos_punto_pre = 0
    pos_punto_pos = 0    
    ip_vec = []
    
    for i in range(3):
        pos_punto_pos = ip.find(".", pos_punto_pre)
        sub_str = ip[pos_punto_pre:pos_punto_pos]      
            
        # Pasamos a formato numerico
        sub_str = int(sub_str)
        
        ip_vec.append(sub_str)
        pos_punto_pre = pos_punto_pos + 1

    # Agregamos lo que falta
    
    sub_str = ip[pos_punto_pre:]
	
    #print sub_str
    # Pasamos a formato numerico
    sub_str = int(sub_str)
    
    ip_vec.append(sub_str)
    
    # Sumamos uno
    ip_vec[3] += 1
    
    i = 3
    
    while(ip_vec[i] > 255):
        ip_vec[i] = 0
        ip_vec[i - 1] += 1
        i -= 1
	
    # Reconstruir la ip
    
    ip_res = ""
    
    for i in range(3):
        ip_res += str(ip_vec[i]) + "."
    ip_res += str(ip_vec[3])
    
    return ip_res

#rango_red = "192.168.1.0/24"
rango_red = "192.168.1.0/18"
pos = rango_red.find("/")
dir_subred = rango_red[0:pos]
sufix = rango_red[pos+1:]

dir_subred_num = ip_to_bin(dir_subred)  
print dir_subred_num

dir_subred = bin_to_ip(dir_subred_num)
print dir_subred

unos = "11111111111111111111111111111111"
print len(unos)
sufix = int(sufix)
mask = unos[:sufix]

while(len(mask) < 32):
    mask += "0"

print mask
print dir_subred_num
#print len(dir_subred_num)

#mask = int(mask)
#dir_subred_num = int(dir_subred_num)

dir_subred_base = ""
for i in range(32):
    s = str(int(dir_subred_num[i]) & int(mask[i]))
    dir_subred_base += s

print dir_subred_base

rango = []
#print 2 ** (32 - sufix)
dir = bin_to_ip(dir_subred_base)
cant = 2 ** (32 - sufix)

for i in range(cant):
    rango.append(dir)
    print dir
    dir = inc(dir)  
